//package baseFx.common.mq.rabbitmq;
//
//import com.rabbitmq.client.Channel;
//import com.rabbitmq.client.Connection;
//import org.apache.commons.pool2.PooledObjectFactory;
//import org.apache.commons.pool2.impl.GenericObjectPool;
//import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
//
//import java.io.IOException;
//
//public class MqConnection extends ConnectionWrapper {
//    private GenericObjectPool<MqChannel> channels;
//    private RabbitMqContext context;
//
//    public MqConnection(Connection connection, RabbitMqContext context, PoolConfig config) {
//        super(connection);
//        this.context = context;
//        channels = createPool(config);
//    }
//
//    protected GenericObjectPool<MqChannel> createPool(PoolConfig config) {
//        GenericObjectPoolConfig pc = new GenericObjectPoolConfig();
//        pc.setMinIdle(config.channelMin);
//        pc.setMaxTotal(config.channelMax);
//        pc.setMaxIdle(config.channelMaxIdle);
//        return new GenericObjectPool<>(createPOFactory(), pc);
//    }
//
//    protected PooledObjectFactory<MqChannel> createPOFactory() {
//        return new ChannelPOFactory(this);
//    }
//
//    void returnChannel(MqChannel channel) {
//        channels.returnObject(channel);
//    }
//
//    Channel baseCreateChannel() {
//        try {
//            return super.createChannel();
//        } catch (IOException e) {
//            e.printStackTrace();
//            return null;
//        }
//    }
//
//    @Override
//    public Channel createChannel() {
//        try {
//            MqChannel channel = channels.borrowObject();
//            return channel;
//        } catch (Exception e) {
//            e.printStackTrace();
//            return null;
//        }
//    }
//
//    @Override
//    public Channel createChannel(int i) {
//        throw new RuntimeException("请使用createChannel()。");
//    }
//
//    private void returnToPool() {
//        context.returnConnection(this);
//    }
//
//    public void destroy() {
//        try {
//            super.close();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        channels.close();
//        channels = null;
//    }
//
//    @Override
//    public void close(int i, String s) throws IOException {
//        returnToPool();
//    }
//
//    @Override
//    public void close() throws IOException {
//        returnToPool();
//    }
//
//    @Override
//    public void close(int i) throws IOException {
//        returnToPool();
//    }
//
//    @Override
//    public void close(int i, String s, int i1) throws IOException {
//        returnToPool();
//    }
//}
